home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / util1 / yk211src.lha / Yak_2.11_Src / Hotkey_types.c < prev    next >
C/C++ Source or Header  |  1995-10-18  |  22KB  |  589 lines

  1. #define __USE_SYSBASE
  2.  
  3. #include <proto/exec.h>
  4. #include <proto/commodities.h>
  5.  
  6. #include <clib/alib_protos.h>
  7.  
  8. #include <exec/types.h>
  9. #include <exec/memory.h>
  10. #include <string.h>
  11.  
  12. #include "code.h"
  13. #include "yak.h"
  14. #include "hotkey_types.h"
  15. #include "Requesters.h"
  16.  
  17. #define CATCOMP_NUMBERS
  18. #include "yak_locale_strings.h"
  19.  
  20.  
  21.  
  22.  
  23. #define END_OPTION { NO_OPT }
  24.  
  25. #ifdef PREFS
  26.  
  27. # define OPTION_DESCRIPTION(Type, LocalID, LabelID, ExcludeIDs, ActivateIDs, DisplayID, DefFlag, DefArgStr, DefArgNum) {Type, LocalID, LabelID, ExcludeIDs, ActivateIDs, DisplayID, DefFlag, DefArgStr, DefArgNum}
  28.  
  29. #elif defined(CONV)
  30.  
  31. # define OPTION_DESCRIPTION(Type, LocalID, LabelID, ExcludeIDs, ActivateIDs, DisplayID, DefFlag, DefArgStr, DefArgNum) {Type, LocalID, DefFlag, DefArgStr, DefArgNum}
  32.  
  33. #else
  34.  
  35. # define OPTION_DESCRIPTION(Type, LocalID, LabelID, ExcludeIDs, ActivateIDs, DisplayID, DefFlag, DefArgStr, DefArgNum) {Type, LocalID}
  36.  
  37. #endif
  38.  
  39.  
  40. OptDescription ChangeScreenHKOption[4] = {
  41.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_NO_SCREEN_CHANGE,        NO_SCREEN_CHANGE_OPT,        HKO_WORKBENCH_TO_FRONT|HKO_DEFAULT_PUBSCR_TO_FRONT, 0, 0, HKO_NO_SCREEN_CHANGE, NULL, 0),
  42.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_WORKBENCH_TO_FRONT,      WORKBENCH_TO_FRONT_OPT,      HKO_NO_SCREEN_CHANGE|HKO_DEFAULT_PUBSCR_TO_FRONT,   0, 1, 0,                    NULL, 0),
  43.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_DEFAULT_PUBSCR_TO_FRONT, DEFAULT_PUBSCR_TO_FRONT_OPT, HKO_NO_SCREEN_CHANGE|HKO_WORKBENCH_TO_FRONT,        0, 2, 0,                    NULL, 0),
  44.    END_OPTION 
  45. };
  46.  
  47. OptDescription CommandHKOption[7] = {
  48.    OPTION_DESCRIPTION( TOGGLE_OPT,  HKO_CLI_COMMAND     , CLI_OPT       , HKO_AREXX_COMMAND, HKO_STACK_COMMAND|HKO_PRIORITY_COMMAND, 0, HKO_CLI_COMMAND,      NULL, 0),
  49.    OPTION_DESCRIPTION( TOGGLE_OPT,  HKO_AREXX_COMMAND   , AREXX_OPT     , HKO_CLI_COMMAND,   HKO_AREXX_PORT,                         3, 0,                    NULL, 0),
  50.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_STACK_COMMAND   , STACK_OPT     , 0,                 0,                                      1, HKO_STACK_COMMAND,    NULL, 4000),
  51.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_PRIORITY_COMMAND, PRIORITY_OPT  , 0,                 0,                                      2, HKO_PRIORITY_COMMAND, NULL, 0),
  52.    OPTION_DESCRIPTION( STRING_OPT,  HKO_COMMAND         , COMMAND_OPT   , 0,                 0,                                      5, 0,                    NULL, 0),
  53.    OPTION_DESCRIPTION( STRING_OPT,  HKO_AREXX_PORT      , AREXX_PORT_OPT, 0,                 0,                                      4, HKO_AREXX_PORT,       "AREXX", 0),
  54.    END_OPTION 
  55. };
  56.  
  57. OptDescription SelectWindowHKOption[5] = {
  58.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_ACTIVE,      ACTIVE_WINDOW_OPT,     HKO_UNDER_MOUSE|HKO_BY_TITLE, 0,           0, HKO_ACTIVE, NULL, 0 ),
  59.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_UNDER_MOUSE, WINDOW_UNDER_MOUSE_OPT,HKO_ACTIVE|HKO_BY_TITLE,      0,           1, 0,          NULL, 0 ),
  60.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_BY_TITLE,    BY_WINDOW_TITLE_OPT,   HKO_ACTIVE|HKO_UNDER_MOUSE,   HKO_PATTERN, 2, 0,          NULL, 0 ),
  61.    OPTION_DESCRIPTION( STRING_OPT, HKO_PATTERN,     PATTERN_OPT,           0,                            0,           3, 0,          NULL, 0 ),
  62.    END_OPTION 
  63. };
  64.  
  65. OptDescription SelectScreen0HKOption[6] = {
  66.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_FRONTMOST,   FRONTMOST_SCREEN_OPT,  HKO_ACTIVE|HKO_UNDER_MOUSE|HKO_BY_TITLE,    0,           0, HKO_FRONTMOST, NULL, 0 ),
  67.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_ACTIVE,      ACTIVE_SCREEN_OPT,     HKO_FRONTMOST|HKO_UNDER_MOUSE|HKO_BY_TITLE, 0,           1, 0,             NULL, 0 ),
  68.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_UNDER_MOUSE, SCREEN_UNDER_MOUSE_OPT,HKO_FRONTMOST|HKO_ACTIVE|HKO_BY_TITLE,      0,           2, 0,             NULL, 0 ),
  69.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_BY_TITLE,    BY_SCREEN_TITLE_OPT,   HKO_FRONTMOST|HKO_ACTIVE|HKO_UNDER_MOUSE,   HKO_PATTERN, 3, 0,             NULL, 0 ),
  70.    OPTION_DESCRIPTION( STRING_OPT, HKO_PATTERN,     PATTERN_OPT,           0,                                          0,           4, 0,             NULL, 0 ),
  71.    END_OPTION 
  72. };
  73.  
  74. OptDescription SelectScreen1HKOption[6] = {
  75.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_REARMOST,    REARMOST_SCREEN_OPT,   HKO_ACTIVE|HKO_UNDER_MOUSE|HKO_BY_TITLE,   0,           0, HKO_REARMOST, NULL, 0 ),
  76.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_ACTIVE,      ACTIVE_SCREEN_OPT,     HKO_REARMOST|HKO_UNDER_MOUSE|HKO_BY_TITLE, 0,           1, 0,            NULL, 0 ),
  77.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_UNDER_MOUSE, SCREEN_UNDER_MOUSE_OPT,HKO_REARMOST|HKO_ACTIVE|HKO_BY_TITLE,      0,           2, 0,            NULL, 0 ),
  78.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_BY_TITLE,    BY_SCREEN_TITLE_OPT,   HKO_REARMOST|HKO_ACTIVE|HKO_UNDER_MOUSE,   HKO_PATTERN, 3, 0,            NULL, 0 ),
  79.    OPTION_DESCRIPTION( STRING_OPT, HKO_PATTERN,     PATTERN_OPT,           0,                                         0,           4, 0,            NULL, 0 ),
  80.    END_OPTION 
  81. };
  82.  
  83.  
  84. OptDescription ResizeWindowHKOption[4] = {
  85.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_RESIZE_HORIZONTAL,  RESIZE_HORIZONTAL_OPT,  0, 0,                      0, HKO_RESIZE_HORIZONTAL,  NULL, 0 ),
  86.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_RESIZE_VERTICAL,    RESIZE_VERTICAL_OPT,    0, HKO_RESIZE_VISIBLE_BAR, 1, HKO_RESIZE_VERTICAL,    NULL, 0 ),
  87.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_RESIZE_VISIBLE_BAR, VISIBLE_SCREEN_BAR_OPT, 0, 0,                      2, HKO_RESIZE_VISIBLE_BAR, NULL, 0 ),
  88.    END_OPTION 
  89. };
  90.  
  91. OptDescription MoveWindowHKOption[10] = {
  92.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_NO_VERTICAL_MOVING,     NO_VERTICAL_MOVING_OPT,     HKO_MOVE_TOP|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_BOTTOM,              HKO_MOVE_VISIBLE_BAR, 0, 0,                    NULL, 0 ),
  93.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_TOP,               MOVE_TOP_OPT,               HKO_NO_VERTICAL_MOVING|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_BOTTOM,    HKO_MOVE_VISIBLE_BAR, 1, HKO_MOVE_TOP,         NULL, 0 ),
  94.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_VERTICAL_CENTER,   MOVE_VERTICAL_CENTER_OPT,   HKO_NO_VERTICAL_MOVING|HKO_MOVE_TOP|HKO_MOVE_BOTTOM,                0,                    2, 0,                    NULL, 0 ),
  95.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_BOTTOM,            MOVE_BOTTOM_OPT,            HKO_NO_VERTICAL_MOVING|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_TOP,       0,                    3, 0,                    NULL, 0 ),
  96.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_VISIBLE_BAR,       VISIBLE_SCREEN_BAR_OPT,     0,                                                                  0,                    4, HKO_MOVE_VISIBLE_BAR, NULL, 0 ),
  97.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_NO_HORIZONTAL_MOVING,   NO_HORIZONTAL_MOVING_OPT,   HKO_MOVE_LEFT|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_RIGHT,            0,                    5, 0,                    NULL, 0 ),
  98.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_LEFT,              MOVE_LEFT_OPT,              HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_RIGHT, 0,                    6, HKO_MOVE_LEFT,                    NULL, 0 ),
  99.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_HORIZONTAL_CENTER, MOVE_HORIZONTAL_CENTER_OPT, HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_LEFT|HKO_MOVE_RIGHT,              0,                    7, 0,                    NULL, 0 ),
  100.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_RIGHT,             MOVE_RIGHT_OPT,             HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_LEFT,  0,                    8, 0,                    NULL, 0 ),
  101.    END_OPTION 
  102. };
  103.  
  104. OptDescription InsertDateHKOption[2] = {
  105.    OPTION_DESCRIPTION( STRING_OPT, HKO_DATE_FORMAT, DATE_FORMAT_OPT, 0, 0, 0, 0, NULL, 0 ),
  106.    END_OPTION 
  107. };
  108.  
  109. OptDescription InsertTextHKOption[3] = {
  110.    OPTION_DESCRIPTION( STRING_OPT,  HKO_INSERT_STRING, INSERT_OPT,          0, 0, 0, 0, NULL, 0 ),
  111.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_INSERT_DELAY,  INSERT_DELAY_OPT,    0, 0, 1, HKO_INSERT_DELAY,    NULL, 0 ),
  112.    END_OPTION 
  113. };
  114.  
  115. OptDescription MenuHKOption[5] = {
  116.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_MENU_NUMBER,    MENU_NUMBER_OPT,    0, 0,                  0, HKO_MENU_NUMBER,    NULL, 0 ),
  117.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_ITEM_NUMBER,    ITEM_NUMBER_OPT,    0, 0,                  1, HKO_ITEM_NUMBER,    NULL, 0 ),
  118.    OPTION_DESCRIPTION( TOGGLE_OPT,  HKO_SUBITEM,        SUBITEM_OPT    ,    0, HKO_SUBITEM_NUMBER, 2, 0,                  NULL, 0 ),
  119.    OPTION_DESCRIPTION( INTEGER_OPT, HKO_SUBITEM_NUMBER, SUBITEM_NUMBER_OPT, 0, 0,                  3, HKO_SUBITEM_NUMBER, NULL, 0 ),
  120.    END_OPTION 
  121. };
  122.  
  123. OptDescription CycleWindowsHKOption[6] = {
  124.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_BACK_CYCLE         , Back_Cycle_OPT        , 0, 0,                     0, 0, NULL, 0 ),
  125.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_EXCLUDE_WB_DRAWERS , Exclude_Wb_Drawers_OPT, 0, 0,                     1, 0, NULL, 0 ),
  126.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_BY_WINDOW_TASK_NAME, By_Task_Name_OPT      , 0, HKO_TASK_NAME_PATTERN, 3, 0, NULL, 0 ),
  127.    OPTION_DESCRIPTION( STRING_OPT, HKO_TASK_NAME_PATTERN  , PATTERN_OPT           , 0, 0,                     4, 0, NULL, 0 ),
  128.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_ACTIVATE_ONLY      , ACTIVATE_ONLY_OPT     , 0, 0,                     2, 0, NULL, 0 ),
  129.    END_OPTION 
  130. };
  131.  
  132. OptDescription MoveScreenHKOption[10] = {
  133.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_NO_VERTICAL_MOVING,     NO_VERTICAL_MOVING_OPT,     HKO_MOVE_TOP|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_BOTTOM,              0, 0, 0,             NULL, 0 ),
  134.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_TOP,               MOVE_TOP_OPT,               HKO_NO_VERTICAL_MOVING|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_BOTTOM,    0, 1, HKO_MOVE_TOP,  NULL, 0 ),
  135.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_VERTICAL_CENTER,   MOVE_VERTICAL_CENTER_OPT,   HKO_NO_VERTICAL_MOVING|HKO_MOVE_TOP|HKO_MOVE_BOTTOM,                0, 2, 0,             NULL, 0 ),
  136.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_BOTTOM,            MOVE_BOTTOM_OPT,            HKO_NO_VERTICAL_MOVING|HKO_MOVE_VERTICAL_CENTER|HKO_MOVE_TOP,       0, 3, 0,             NULL, 0 ),
  137.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_NO_HORIZONTAL_MOVING,   NO_HORIZONTAL_MOVING_OPT,   HKO_MOVE_LEFT|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_RIGHT,            0, 4, HKO_MOVE_LEFT, NULL, 0 ),
  138.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_LEFT,              MOVE_LEFT_OPT,              HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_RIGHT, 0, 5, 0,             NULL, 0 ),
  139.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_HORIZONTAL_CENTER, MOVE_HORIZONTAL_CENTER_OPT, HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_LEFT|HKO_MOVE_RIGHT,              0, 6, HKO_MOVE_LEFT, NULL, 0 ),
  140.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_RIGHT,             MOVE_RIGHT_OPT,             HKO_NO_HORIZONTAL_MOVING|HKO_MOVE_HORIZONTAL_CENTER|HKO_MOVE_LEFT,  0, 7, 0,             NULL, 0 ),
  141.    OPTION_DESCRIPTION( TOGGLE_OPT, HKO_MOVE_VISIBLE_ACTIVE,    VISIBLE_ACTIVE_WINDOW_OPT,  0,                                                                  0, 8, 0,             NULL, 0 ),
  142.    END_OPTION 
  143. };
  144.  
  145.  
  146. #ifdef PREFS
  147.  
  148. # define OPTION_LIST(Descriptions, LabelID) {Descriptions, LabelID}
  149.  
  150. #else
  151.  
  152. # define OPTION_LIST(Descriptions, LabelID) {Descriptions}
  153.  
  154. #endif
  155.  
  156.  
  157.  
  158. OptsList opt_ExecuteCommand[] = {
  159.    OPTION_LIST(ChangeScreenHKOption, SCREEN_OPT ),
  160.    OPTION_LIST(CommandHKOption,      SPECIFICATION_OPT )
  161. };
  162.  
  163. OptsList opt_CloseWindow[] = {
  164.    OPTION_LIST(SelectWindowHKOption, SELECT_OPT )
  165. };
  166.  
  167. OptsList opt_ZipWindow[] = {
  168.    OPTION_LIST(SelectWindowHKOption, SELECT_OPT )
  169. };
  170.  
  171. OptsList opt_ShrinkWindow[] = {
  172.    OPTION_LIST(SelectWindowHKOption, SELECT_OPT ),
  173.    OPTION_LIST(ResizeWindowHKOption, RESIZE_WINDOW_OPT )
  174. };
  175.  
  176. OptsList opt_ExpandWindow[] = {
  177.    OPTION_LIST(SelectWindowHKOption, SELECT_OPT ),
  178.    OPTION_LIST(ResizeWindowHKOption, RESIZE_WINDOW_OPT )
  179. };
  180.  
  181. OptsList opt_MoveWindow[] = {
  182.    OPTION_LIST(SelectWindowHKOption, SELECT_OPT ),
  183.    OPTION_LIST(MoveWindowHKOption,   MOVE_OPT )
  184. };
  185.  
  186.  
  187. OptsList opt_OpenPalette[] = {
  188.    OPTION_LIST(ChangeScreenHKOption, SCREEN_OPT )
  189. };
  190.  
  191. OptsList opt_CycleWindows[] = {
  192.    OPTION_LIST(SelectScreen0HKOption, SELECT_OPT ),
  193.    OPTION_LIST(CycleWindowsHKOption, SPECIFICATION_OPT )
  194. };
  195.  
  196. OptsList opt_ScreenToFront[] = {
  197.    OPTION_LIST(SelectScreen1HKOption, SELECT_OPT )
  198. };
  199.  
  200. OptsList opt_ScreenToBack[] = {
  201.    OPTION_LIST(SelectScreen0HKOption, SELECT_OPT )
  202. };
  203.  
  204. OptsList opt_MoveScreen[] = {
  205.    OPTION_LIST(SelectScreen0HKOption, SELECT_OPT ),
  206.    OPTION_LIST(MoveScreenHKOption,   MOVE_OPT )
  207. };
  208.  
  209. OptsList opt_ShowInterface[] = {
  210.    OPTION_LIST(ChangeScreenHKOption, SCREEN_OPT )
  211. };
  212.  
  213. OptsList opt_InsertDate[] = {
  214.    OPTION_LIST(InsertDateHKOption, SPECIFICATION_OPT )
  215. };
  216.  
  217. OptsList opt_InsertText[] = {
  218.    OPTION_LIST(InsertTextHKOption, SPECIFICATION_OPT )
  219. };
  220.  
  221. OptsList opt_MenuShortcut[] = {
  222.    OPTION_LIST(MenuHKOption, SPECIFICATION_OPT )
  223. };
  224.  
  225.  
  226. OptsList opt_CurrentScreenAsDefPub[1];   /* No option */
  227. OptsList opt_ActivateWorkbench[1];       /* No option */
  228. OptsList opt_BlankDisplay[1];            /* No option */
  229.  
  230.  
  231.  
  232. /*
  233.  * HotKey Action function prototypes
  234.  */
  235.  
  236. #if !defined(PREFS) && !defined(CONV)
  237.  
  238. GLOBAL
  239. void  act_ExecuteCommand(YakHotKey *yhk),        act_CloseWindow(YakHotKey *yhk),
  240.       act_ZipWindow(YakHotKey *yhk),             act_ShrinkWindow(YakHotKey *yhk),
  241.       act_ExpandWindow(YakHotKey *yhk),          act_MoveWindow(YakHotKey *yhk),
  242.       act_CycleWindows(YakHotKey *yhk),          act_OpenPalette(YakHotKey *yhk),
  243.       act_ScreenToFront(YakHotKey *yhk),         act_ScreenToBack(YakHotKey *yhk),
  244.       act_ActivateWorkbench(YakHotKey *yhk),     act_MoveScreen(YakHotKey *yhk),
  245.       act_BlankDisplay(YakHotKey *yhk),          act_InsertText(YakHotKey *yhk),
  246.       act_InsertDate(YakHotKey *yhk),            act_ShowInterface(YakHotKey *yhk),
  247.       act_CurrentScreenAsDefPub(YakHotKey *yhk), act_MenuShortcut(YakHotKey *yhk);
  248. #endif
  249.  
  250.  
  251.  
  252. #if defined (PREFS)
  253.  
  254. # define HOTKEY_DESCRIPTION(name, nameact, optsnum, helpnode) {EMPTY_MINLIST, nameact, helpnode, optsnum, opt_##name}
  255.  
  256. #elif defined (CONV)
  257.  
  258. # define HOTKEY_DESCRIPTION(name, nameact, optsnum, helpnode) {EMPTY_MINLIST, nameact, optsnum, opt_##name}
  259.  
  260. #else
  261.  
  262. # define HOTKEY_DESCRIPTION(name, nameact, optsnum, helpnode) {EMPTY_MINLIST, act_##name, optsnum, opt_##name}
  263.  
  264. #endif
  265.  
  266.  
  267. YakHotKeyType yhktypes[NUM_HOTKEY_TYPES] = {
  268.     HOTKEY_DESCRIPTION( ExecuteCommand,        ExecuteCommand_ACT,        2, "Execute Command" ),
  269.     HOTKEY_DESCRIPTION( CloseWindow,           CloseWindow_ACT,           1, "Close Window" ),
  270.     HOTKEY_DESCRIPTION( ZipWindow,             ZipWindow_ACT,             1, "Zip Window" ),
  271.     HOTKEY_DESCRIPTION( ShrinkWindow,          ShrinkWindow_ACT,          2, "Shrink Window" ),
  272.     HOTKEY_DESCRIPTION( ExpandWindow,          ExpandWindow_ACT,          2, "Expand Window" ),
  273.     HOTKEY_DESCRIPTION( MoveWindow,            MoveWindow_ACT,            2, "Move Window" ),
  274.     HOTKEY_DESCRIPTION( CycleWindows,          CycleWindows_ACT,          2, "Cycle Windows" ),
  275.     HOTKEY_DESCRIPTION( OpenPalette,           OpenPalette_ACT,           1, "Open Palette" ),
  276.     HOTKEY_DESCRIPTION( ScreenToFront,         ScreenToFront_ACT,         1, "Screen to Front" ),
  277.     HOTKEY_DESCRIPTION( ScreenToBack,          ScreenToBack_ACT,          1, "Screen to Back" ),
  278.     HOTKEY_DESCRIPTION( MoveScreen,            MoveScreen_ACT,            2, "Move Screen" ),
  279.     HOTKEY_DESCRIPTION( ActivateWorkbench,     ActivateWorkbench_ACT,     0, "Activate Workbench" ),
  280.     HOTKEY_DESCRIPTION( BlankDisplay,          BlankDisplay_ACT,          0, "Blank Display" ),
  281.     HOTKEY_DESCRIPTION( InsertText,            InsertText_ACT,            1, "Insert Text" ),
  282.     HOTKEY_DESCRIPTION( InsertDate,            InsertDate_ACT,            1, "Insert Date" ),
  283.     HOTKEY_DESCRIPTION( ShowInterface,         ShowInterface_ACT,         1, "Show Yak Interface" ),
  284.     HOTKEY_DESCRIPTION( CurrentScreenAsDefPub, CurrentScreenAsDefPub_ACT, 0, "Set default public screen" ),
  285.     HOTKEY_DESCRIPTION( MenuShortcut,          MenuShortcut_ACT,          1, "Menu shortcut" )
  286. };
  287.  
  288.  
  289.  
  290. /* allocate memory region of size len+1, copy string to it */
  291. char *
  292. DupStr(char *str)
  293. {
  294.     char *newstr;
  295.     ULONG len;
  296.  
  297.     if (newstr = AllocVec(len=(strlen(str)+1),MEMF_CLEAR))
  298.     {
  299.         CopyMem(str,newstr,len);
  300.     }
  301.     return newstr;
  302. }
  303.  
  304.  
  305.  
  306. /*
  307.  * YakOption manipulation routines
  308.  */
  309.  
  310.  
  311. #if defined(PREFS) || defined(CONV)
  312. void
  313. DefaultOptions(YakHotKey *yhk)
  314. {
  315.     UWORD ol, optslist;
  316.     OptDescription *curdesc;
  317.  
  318.     optslist  = YHK_Takes_Opt(yhk);
  319.  
  320.     for (ol=0; ol<optslist; ol++)
  321.     {
  322.         UWORD as=0;   /* ArgStr number */
  323.         UWORD an=0;   /* ArgNum number */
  324.  
  325.         curdesc = yhktypes[yhk->yhk_Type].yhkt_OptsList[ol].Desc;
  326.  
  327.         while (curdesc->Type != NO_OPT)
  328.         {
  329.             yhk->yhk_Option[ol].Flags |= curdesc->DefFlag;
  330.  
  331.             switch(curdesc->Type)
  332.             {
  333.                 case STRING_OPT:
  334.                     if (curdesc->DefFlag)
  335.                         yhk->yhk_Option[ol].ArgStr[as] = DupStr(curdesc->DefArgStr);
  336.                     as++;
  337.                     break;
  338.  
  339.                 case INTEGER_OPT:
  340.                     yhk->yhk_Option[ol].ArgNum[an] = curdesc->DefArgNum;
  341.                     an++;
  342.                     break;
  343.             }
  344.  
  345.             curdesc++;
  346.         }
  347.     }
  348. }
  349. #endif
  350.  
  351.  
  352. /* free ALL memory associated with options */
  353. static void
  354. FreeYakOptions(YakOption *opt, UWORD type)
  355. {
  356.     UWORD ol, optslist=yhktypes[type].yhkt_OptsNum;
  357.  
  358.     for (ol=0; ol<optslist; ol++)
  359.     {
  360.         OptDescription *curdesc=yhktypes[type].yhkt_OptsList[ol].Desc;
  361.         UWORD as=0;   /* ArgStr number */
  362.  
  363.         while (curdesc->Type != NO_OPT)
  364.         {
  365.             if (curdesc->Type == STRING_OPT)
  366.                 FreeVec(opt[ol].ArgStr[as++]);
  367.  
  368.             curdesc++;
  369.         }
  370.     
  371.         FreeVec(opt[ol].ArgStr);
  372.         FreeVec(opt[ol].ArgNum);
  373.     }
  374.  
  375.     FreeVec(opt);
  376. }
  377.  
  378.  
  379. static YakOption *
  380. AllocYakOptions(UWORD type)
  381. {
  382.     YakOption *newop;
  383.     UWORD ol, optslist=yhktypes[type].yhkt_OptsNum;
  384.  
  385.     if (newop=AllocVec(optslist*sizeof(YakOption), MEMF_CLEAR))
  386.     {
  387.         for (ol=0; ol<optslist; ol++)
  388.         {
  389.             OptDescription *curdesc=yhktypes[type].yhkt_OptsList[ol].Desc;
  390.             UWORD as=0;   /* ArgStr number */
  391.             UWORD an=0;   /* ArgNum number */
  392.  
  393.             while (curdesc->Type != NO_OPT)
  394.             {
  395.                 if (curdesc->Type == STRING_OPT)
  396.                     as++;
  397.                 if (curdesc->Type == INTEGER_OPT)
  398.                     an++;
  399.                 curdesc++;
  400.             }
  401.  
  402.             if (as)
  403.                                 newop[ol].ArgStr = AllocVec(as*sizeof(STRPTR), MEMF_CLEAR);
  404.             if (an)
  405.                                 newop[ol].ArgNum = AllocVec(an*sizeof(LONG), MEMF_CLEAR);
  406.         }
  407.     }
  408.  
  409.     return(newop);
  410. }
  411.  
  412.  
  413.  
  414. /*
  415.  * YakHotKey manipulation routines
  416.  */
  417.  
  418. static void internal_DeleteYakHotKey(YakHotKey *yhk);
  419.  
  420. /* free fields of hotkey */
  421. static void
  422. internal_DeleteYakHotKey(YakHotKey *yhk)
  423. {
  424.     if (yhk->yhk_KeyDef)
  425.         FreeVec(yhk->yhk_KeyDef);
  426.  
  427.     if (yhk->yhk_Name)
  428.         FreeVec(yhk->yhk_Name);
  429.  
  430.     FreeYakOptions(yhk->yhk_Option, yhk->yhk_Type);
  431.  
  432. #ifndef PREFS
  433.     if (yhk->yhk_CxObj)
  434.         DeleteCxObjAll(yhk->yhk_CxObj);
  435. #endif
  436. }
  437.  
  438. /* free ALL memory associated with a hotkey and remove from list */
  439. void
  440. DeleteYakHotKey(YakHotKey *yhk)
  441. {
  442.     Remove((struct Node *)yhk);
  443.     internal_DeleteYakHotKey(yhk);
  444.     FreeVec(yhk);
  445. }
  446.  
  447. /* create or change key definition 
  448. **
  449. ** For prefs program and inactive hotkeys
  450. ** we create a CxObj just to test the specification of hot key.
  451. */
  452. int
  453. ModifyYHKKeyDef(YakHotKey *yhk, char *keystr)
  454. {
  455. #ifndef CONV
  456.     CxObj *filter;
  457.     char  *newdef;
  458.  
  459.     if (filter = HotKey(keystr, broker_mp, (LONG)yhk))
  460.     {
  461. #ifndef PREFS
  462.         /* delete old filter and use new one */
  463.         if (yhk->yhk_CxObj)
  464.             DeleteCxObjAll(yhk->yhk_CxObj);
  465.         /* Add if active */
  466.         if (yhk->yhk_State == YKHK_ACTIVE)
  467.         {
  468.             yhk->yhk_CxObj = filter;
  469.             AttachCxObj(broker, filter);
  470.         }
  471. #endif
  472.  
  473.         /* and store new keystr */
  474.         if (newdef = DupStr(keystr))
  475.         {
  476.             FreeVec(yhk->yhk_KeyDef);
  477.             yhk->yhk_KeyDef = newdef;
  478.             return TRUE;
  479.         }
  480.         PostError(getString(Allocation_ERR));
  481.     }
  482.     else PostError("%s:\n\"%s\"", getString(Invalid_hotkey_specif_ERR), keystr);
  483.  
  484. #else   /* Convert */
  485.         /* and store keystr */
  486.         if (yhk->yhk_KeyDef = DupStr(keystr))
  487.         {
  488.             return TRUE;
  489.         }
  490.         PostError(getString(Allocation_ERR));
  491.  
  492. #endif
  493.  
  494.     return FALSE;
  495. }
  496.  
  497.  
  498. /* change hotkey name */
  499. int
  500. ModifyYHKName(YakHotKey *yhk, char *namestr)
  501. {
  502. #if defined(PREFS) || defined(CONV)
  503.     if (namestr && *namestr)
  504.     {
  505.         char *newstr;
  506.  
  507.         if (newstr = DupStr(namestr))
  508.         {
  509.             FreeVec(yhk->yhk_Name);
  510.             yhk->yhk_Name = newstr;
  511.             yhk->yhk_Node.ln_Name = yhk->yhk_Name;
  512.             return TRUE;
  513.         }
  514.         PostError(getString(Allocation_ERR));
  515.     }
  516.     else PostError(getString(Name_unspecified_for_key_ERR));
  517.  
  518.     return FALSE;
  519. #else
  520.         return TRUE;       /* Yak only! */
  521. #endif
  522. }
  523.  
  524.  
  525.  
  526. /* add a new hotkey of given type */
  527. YakHotKey *
  528. NewYakHotKey(UWORD type)
  529. {
  530.     YakHotKey *newhk;
  531.  
  532.     if (newhk=AllocVec(sizeof(YakHotKey), MEMF_CLEAR))
  533.     {
  534.         newhk->yhk_Node.ln_Name = "unnamed";
  535.         newhk->yhk_Type         = type;
  536.         
  537.         if (!YHK_Takes_Opt(newhk) || (newhk->yhk_Option=AllocYakOptions(type)))
  538.         {
  539.             AddTail(keylist(type), (struct Node *)newhk);
  540.             return newhk;
  541.         }
  542.  
  543.         FreeVec(newhk);
  544.     }
  545.  
  546.     PostError(getString(Allocation_ERR));
  547.  
  548.     return NULL;
  549. }
  550.  
  551. /* initialise list */
  552. void
  553. InitYakHotKeyList(void)
  554. {
  555.     UWORD i;
  556.  
  557.     for (i = 0; i < NUM_HOTKEY_TYPES; i++)
  558.         NewList(keylist(i));
  559. }
  560.  
  561. /* delete whole list */
  562. void
  563. DeleteYakHotKeyList(void)
  564. {
  565.     YakHotKey *yhk;
  566.     UWORD i;
  567.  
  568.     for (i = 0; i < NUM_HOTKEY_TYPES; i++)
  569.         while (yhk = (YakHotKey *)RemHead(keylist(i)))
  570.             DeleteYakHotKey(yhk);
  571. }
  572.  
  573.  
  574. #ifdef PREFS
  575. /* control hotkey */
  576. APTR
  577. ControlYakHotKey(YakHotKey *yhk)
  578. {
  579.     if (!yhk->yhk_Name)
  580.         return Name_unspecified_for_key_ERR;
  581.  
  582.     if (!yhk->yhk_KeyDef)
  583.         return Invalid_hotkey_specif_ERR;
  584.  
  585.     return NULL;    /* All ok */
  586. }
  587. #endif
  588.  
  589.